import time
from typing import Any

from sqlalchemy.exc import IntegrityError
from sqlmodel import SQLModel, Field, Session, select

import namecard
import namecardholder
from settings import auto_session


class NameCardRecycle(SQLModel, table=True):
    __tablename__ = 'namecardrecycle'

    # 定义类的属性，表示名片夹的各个字段
    namecard_id:  int = Field(primary_key=True, nullable=False, foreign_key="namecard.id", ondelete="CASCADE")
    recycletime: int

    def __init__(self, namecard_id: int):
        """
        初始化 NameCardRecycle 对象，传入各个属性值并进行赋值。

        参数:
            namecard_id(int):名片号
        """
        super().__init__(namecard_id=namecard_id, recycletime=int(time.time()))

    def to_dict(self) -> dict:
        """
        将 NameCardRecycle 对象转换为字典形式，以便于数据传输和存储。

        返回:
            dict: 返回一个包含名片夹所有信息的字典
        """
        return self.model_dump()

@auto_session
def insert_1_namecardrecycle(namecard_id: int, session: Session = None) -> int | None:
    """
    将单张名片添加到回收站。

    参数:
        namecard_id (int): 名片ID。

    返回:
        int | None: 成功时返回新插入的ID，失败时返回None。
    """
    namecard.recycle_1_namecard(namecard_id=namecard_id, session=session)
    namecardrecycle = NameCardRecycle(namecard_id=namecard_id)
    session.add(namecardrecycle)
    try:
        session.commit()
        return namecardrecycle.namecard_id
    except IntegrityError as e:
        session.rollback()
        print(f"插入数据时出错: {e}")
        return None

@auto_session
def restore_1_namecardrecycle(namecard_id: int, session: Session = None) -> int | None:
    """
    将单张名片从回收站恢复。

    参数:
        user_id (int): 用户ID。
        namecard_id (int): 名片ID。

    返回:
        int | None: 成功时返回0，失败时返回None。
    """
    namecard.restore_1_namecard(namecard_id=namecard_id, session=session)
    namecardrecycle = session.get(NameCardRecycle, namecard_id)
    session.delete(namecardrecycle)
    try:
        session.commit()
        return 0
    except IntegrityError as e:
        session.rollback()
        print(f"删除数据时出错: {e}")
        return None

@auto_session
def search_all_namecardrecycle_by_user(user_id: int, session: Session = None):
    """
#     根据用户ID查询所有回收站名片信息。
#
#     参数:
#         user_id (int): 用户ID。
#
#     返回:
#         list[dict[str, Any]] | None: 名片夹信息列表，或None表示查询失败。
#     """
    holders = namecardholder.search_all_holder(user_id=user_id, isinrecycle=False, session=session)
    holder_ids = [i['id'] for i in holders]
    cards = []
    for holder_id in holder_ids:
        thisnamecards = namecard.search_all_namecard_in_holder(holder_id=holder_id, isinrecycle=True, session=session)
        cards += thisnamecards
    for i in range(len(cards)):
        id = cards[i]['id']
        recycle = session.get(NameCardRecycle, id)
        cards[i] = cards[i] | recycle.model_dump()
    return cards
